home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 109 < prev    next >
Text File  |  1995-09-11  |  54KB  |  1,334 lines

  1. C.S.M.P. Digest             Mon, 11 Sep 95       Volume 3 : Issue 109
  2.  
  3. Today's Topics:
  4.  
  5.         C to Pascal FAQ (1 of 2)
  6.         C to Pascal FAQ (2 of 2)
  7.         Can't Deactivate Default Item??
  8.         MacTCP Question
  9.  
  10.  
  11.  
  12. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  13. (pottier@clipper.ens.fr).
  14.  
  15. The digest is a collection of article threads from the internet newsgroups
  16. comp.sys.mac.programmer.help, csmp.tools and csmp.misc. It is designed for
  17. people who read news semi-regularly and want an archive of the discussions.
  18. If you don't know what a newsgroup is, you probably don't have access to
  19. it. Ask your systems administrator(s) for details. If you don't have access
  20. to news, you may still be able to post messages to the group by using a
  21. mail server like anon.penet.fi (mail help@anon.penet.fi for more
  22. information).
  23.  
  24. Each issue of the digest contains one or more sets of articles (called
  25. threads), with each set corresponding to a 'discussion' of a particular
  26. subject.  The articles are not edited; all articles included in this digest
  27. are in their original posted form (as received by our news server at
  28. nef.ens.fr).  Article threads are not added to the digest until the last
  29. article added to the thread is at least two weeks old (this is to ensure that
  30. the thread is dead before adding it to the digest).  Article threads that
  31. consist of only one message are generally not included in the digest.
  32.  
  33. The digest is officially distributed by two means, by email and ftp.
  34.  
  35. If you want to receive the digest by mail, send email to listserv@ens.fr
  36. with no subject and one of the following commands as body:
  37.     help                                Sends you a summary of commands
  38.     subscribe csmp-digest Your Name     Adds you to the mailing list
  39.     signoff csmp-digest                 Removes you from the list
  40. Once you have subscribed, you will automatically receive each new
  41. issue as it is created.
  42.  
  43. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  44. Questions related to the ftp site should be directed to
  45. scott.silver@dartmouth.edu.
  46.  
  47. -------------------------------------------------------
  48.  
  49. >From catambay@aol.com (Bill the Cat)
  50. Subject: C to Pascal FAQ (1 of 2)
  51. Date: 23 Aug 1995 02:00:14 GMT
  52. Organization: MacPascal Mailing List
  53.  
  54. Here is a FAQ for converting C code to Pascal code which I found awhile
  55. back.  Hope it helps some of you.
  56.  
  57. -- cut here --
  58. _________________________________________________________________________
  59. The Pascal Programmer‘s Guide to Understanding ‘C‘
  60. by Ken Gladstone
  61.  
  62.  
  63. Most of the articles that we receive here at MacTech Magazine use source
  64. code that is written in C.  We have had a number of readers request that
  65. we either publish more articles that use Pascal, or that we provide Pascal
  66. translations of our source code listings.  Since we can‘t force authors to
  67. use Pascal, and since we really don‘t want to translate every piece of C
  68. code that we publish, our reply has always been “You should be reading the
  69. articles to learn the programming concepts, and it shouldn‘t matter what
  70. language we use in the listings.  (Or you should submit more Pascal-based
  71. articles!)“  Well, we have had several readers respond saying that this
  72. would be fine, except that they are unable to read C - a valid complaint.
  73.  
  74. With this article, I aim to remove that as a valid complaint.  This
  75. article is designed to teach Pascal programmers how to understand C code
  76. listings.  Although since my Pascal is a little rusty and I now program
  77. primarily a C, perhaps I should have written an article entitled “The ‘C‘
  78. Programmer‘s Guide to Remembering Pascal!“  This article is in no way
  79. intended to be a complete C reference, but is simply intended to help you
  80. Pascal programmers understand the C listings that you see in our magazine 
  81. or elsewhere.
  82.  
  83. Let me provide a little information on the history of C and some of its
  84. incarnations.  The original Bible for C programmers is a book called “The
  85. C Programming Language“ by Brian Kernighan and Dennis Ritchie, published
  86. by Prentice-Hall.  The book is often refered to as “Kernighan and
  87. Ritchie,“ or simply “K&R.“  If after reading this article you want to see
  88. the true original C reference, I suggest you pick up a copy of K&R.  Since
  89. that time, the C language has been expanded and standardized, resulting in
  90. ANSI C.  In addition to supporting ANSI C, most current compilers have
  91. their own extentions to the language.  At times, I will refer to Mac
  92. specific aspects of the C language.  So, let‘s begin:
  93.  
  94. ___________________________________________________________
  95. COMMENTS
  96.  
  97. We‘ll start with comments because they are easy (and also because K&R
  98. start with them in the reference section of their book).
  99.  
  100. /* A forward slash followed by a star signifies the beginning of a C
  101. comment.  Comments can span multiple lines, and are ended by a star and
  102. another slash */
  103.  
  104. There is a second form of comment that is not in K&R C, but that is
  105. supported in many C compilers, including MPW and Think C.  Two forward
  106. slashes signify a comment that continues until the end of the line.  Here
  107. are three uses of that style comment:
  108.  
  109. // A one line comment
  110. LineOfCode(ThisIs); // Comment at end of a line of code
  111. // LetsCommentOut += ThisLineOfCode;
  112.  
  113. ________________________________________________________________
  114. IDENTIFIERS
  115.  
  116. Both C and Pascal have similar rules about naming identifiers:  you can
  117. use letters, digits and the underscore character, and the first character
  118. cannot be a digit.  But while Pascal identifiers are not case sensitive, C
  119. identifiers are:  variable, Variable and VARIABLE are three different
  120. identifiers.  In fact, in C pretty much everything is case sensitive.
  121.  
  122. OPERATORS
  123. Operators can be a great source of confusion because both C and Pascal use
  124. many of the same special characters, but with vastly different meanings. 
  125.  
  126. The following table summarizes the operators.  I have highlighted the ones
  127. that I feel may cause Pascal programmers the most confusion in reading C. 
  128. The operators are presented in K&R‘s reference order:
  129.  
  130. C Operator      Pascal Equiv.   Description
  131. - --------------------------------------------------------------- --
  132. struc.field     struc.field     Obtain a field of a record (structure).
  133. ptr->field      ptr^.field      Obtain a field of a pointer to a record.
  134. * ptr           ptr^            Dereference a pointer
  135. & variable      @ variable      Return pointer to (address of) a variable
  136. - expr          - expr          Unary negation
  137. ! expr          NOT expr        Logical negation
  138. ~ expr          BNOT( expr)     Bitwise negation (one‘s complement)
  139. ++ var          var := var + 1  Pre-increment (see notes below)
  140. -- var          var := var - 1  Pre-decrement (see below)
  141. var ++          var := var + 1  Post-increment (see below)
  142. var --          var := var - 1  Post-decrement (see below)
  143. (type)expr      type(expr)      C: Type casting, Pascal: type coercion
  144. sizeof expr     Sizeof(expr)    C: sizeof operator, Pascal: Sizeof function
  145. sizeof(type)    Sizeof(type)    C: sizeof operator, Pascal: Sizeof function
  146. e1 * e2         e1 * e2         Mutiplication
  147. e1 / e2         e1 / e2 ( e1 DIV e2 )   Division (see below)
  148. e1 % e2         e1 MOD e2       Remainder (modulo operator)
  149. e1 + e2         e1 + e2         Addition
  150. e1 - e2         e1 - e2         Subtraction
  151. e1 << e2        BSL(e1,e2)      C:Left shift operator, Pascal:left shift func.
  152. e1 >> e2        BSR(e1,e2)      Right shift
  153. e1 < e2         e1 < e2         Relational “less than“ comparison
  154. e1 > e2         e1 > e2         Relational “greater than“ comparison
  155. e1 <= e2        e1 <= e2        Relational “less than or equal“ comparison
  156. e1 >=e2         e1 >= e2        Relational “greater than or equal“ comparison
  157. e1 == e2        e1 = e2         Equal to comparison
  158. e1 != e2        e1 <> e2        Not equal to comparison
  159. e1 & e2         BAND( e1, e2)   Bitwise “and“
  160. e1 ^ e2         BXOR( e1, e2)   Bitwise “exclusive or“
  161. e1 | e2         BOR( e1, e2)    Bitwise “or“
  162. e1 && e2        e1 & e2         Logical “and“
  163. e1 || e2        e1 | e2         Logical “or“
  164. e1 ? e2 : e3    see below       The ternary “conditional“ operator
  165. var = expr      var := expr     Simple assignment
  166. var += expr     var := var + expr       Add then assign
  167. var -= expr     var := var - expr       Subtract then assign
  168. var *= expr     var := var * expr       Multiply then assign
  169. var /= expr     var := var / expr       Divide then assign
  170. var >>= expr    var := BSR(var,expr);   Shift right then assign
  171. var <<= expr    var := BSL(var,expr);   Shift left then assign
  172. var &= expr     var := BAND(var,expr);  Bitwise “and“ then assign
  173. var ^= expr     var := BXOR(var,expr);  Bitwise “exclusive or“ then assign
  174. var |= expr     var := BOR(var,expr);   Bitwise “or“ then assign
  175. expr , expr     see below               Comma operator
  176.  
  177. Some important things to note:  In C, the single equal sign is used for
  178. assignment, while in Pascal, the single equal sign is used for “equal to“
  179. comparison.  C uses two equal signs for “equal to“ comparison.  In C, the
  180. single amperand ‘&‘ is used both for the bitwise “and“ operation (a binary
  181. operator) and for determining the address of a variable (a unary
  182. operator).  In C, the asterisk ‘*‘ is used both for multiplication (binary
  183. operator) and for dereferencing a pointer (unary operator).  In C, parens
  184. are used both for determining order of operations, and also for type
  185. coercion (called casting in C).  There are several C operators that
  186. translate to functions in Pascal (bitwise negation, sizeof, bit shifting,
  187. etc.).  C does not have a built-in exponentiation operator to correspond
  188. to Pascal‘s ‘**‘ operator.
  189.  
  190. Unlike Pascal, C does not have two separate division operators.  It
  191. performs integer division if both operators are of intergral types.
  192. My table doesn‘t tell the whole story of the very useful pre- and
  193. post-increment (and decrement) operators.  These operators are probably
  194. best understood with an example.  So here is a fragment of C code:
  195.  
  196. a = ++b;
  197. c = d++;
  198.  
  199. The Pascal equivalent is:
  200.  
  201. b := b + 1;
  202. a := b;
  203. c := d;
  204. d := d + 1;
  205.  
  206. Both the pre and post increment operators will increment the given
  207. variable.  The difference is when.  The pre-increment operator increments
  208. the variable before using the variable‘s value.  The post-increment
  209. operator uses the existing value and then increments the variable.
  210. The table doesn‘t explain the C ternary “conditional“ operator, ‘a ? b :
  211. c‘.  If the first operand evaluates to non-zero, then the “conditional“
  212. operator evaluates to its second operand, otherwise it evaluates to its
  213. third operand.  This operator is also probably easiest to understand by
  214. example.  Here is some C code:
  215.  
  216. result = a ? b : c;
  217.  
  218. And the Pascal equavalent:
  219.  
  220. IF a<>0 THEN result := b ELSE result := c;
  221.  
  222. The “comma“ operator is another unusual one in C.  It is used to group
  223. expressions (where you would usually expect to see only one expression)
  224. and it evaluates to the value of the right expression.  Once again, here
  225. is a C example (calling a function that takes three parameters):
  226.  
  227. result = myFunction( a, (b=3, b+2), c);
  228.  
  229. and the Pascal equvalent:
  230.  
  231. b := 3;
  232. result: = myFunction( a, b + 2, c );
  233.  
  234. Both of these code fragments end out assigning 3 to b, and end out passing
  235. 5 as the second parameter to myFunction.
  236.  
  237. ___________________________________________________________________
  238. CONSTANTS
  239.  
  240. A sequence of digits generally signifies a decimal constant.  If the
  241. sequence begins with a 0 (zero digit), then the constant is octal.  If the
  242. sequence begins with 0x or 0X, then the constant is hexadecimal, and can
  243. also contain the letters a-f or A-F.  If the sequence ends in the letter
  244. ell (l or L), the constant is an explicit long integer.  For example 123L
  245. is of C type long (Pascal type longint).
  246. A character enclosed in single quotes represents a constant of the ACSII
  247. value of the character.  For example, '!' is the same as 33.  Certain
  248. special character constants can be represented with the following escape
  249. sequences.
  250.  
  251. Sequence        Meaning
  252. - --------------------------------------------------------------- --
  253. \n              The newline character (character 10)
  254. \t              The tab character (character 9)
  255. \b              The backspace character (character 8)
  256. \r              Carriage return (character 13)
  257. \f              Form feed (character 12)
  258. \\              Backslash
  259. \'              Single quote
  260. \ddd            The octal constant represented by the 1, 2 or 3 digits ddd.
  261.  
  262.  
  263. _____________________________________________________________________
  264. PROGRAM STRUCTURE
  265.  
  266. Unlike Pascal, C does not differentiate between procedures and functions -
  267. in C, everything is a function.  But C functions are not required to
  268. return values, so a C function that does not return a value is like a
  269. Pascal procedure.  C uses the keyword void as the return type for a
  270. function that does not return a value.  C also uses the keyword void as
  271. the parameter list for functions which take no parameters.  Unlike Pascal,
  272. C does not allow nested functions.  All C functions are at the same level.
  273.  
  274. C does not have an equivalent to the Pascal PROGRAM keyword.  Instead, C
  275. knows where to start executing by looking for a function called main. 
  276. main is not a reserved C keyword, it is just a C compiler convention to
  277. generate code that starts by executing a function called main.  Pascal
  278. uses BEGIN and END to create a block of statements (a compound
  279. statement).  C uses curly braces, so ‘{‘ is equivalent to BEGIN and ‘}‘ is
  280. equivalent to END.
  281.  
  282. Pascal only needs semicolons between two statements - it doesn‘t need one
  283. on the last statement of a block (compound statement), nor in constructs
  284. with just a single statement.  C needs a semicolon after every statement. 
  285. However, C does not put a semicolon after the end of a block, nor does it
  286. put a period at the end of a unit.  C compilers just keep parsing a source
  287. files until reaching the EOF.
  288.  
  289. Using the preceeding rules, here is an example of a C function with no
  290. return value, and its Pascal equivalent procedure.  First the C version:
  291.  
  292. void myProc( long myFirstParam, char mySecondParam )
  293. {
  294.   /* Here we have some code that does something */
  295. }
  296. Now the Pascal version:
  297.  
  298. procedure myProc(myFirstParam: LONGINT, mySecondParam: CHAR);
  299. BEGIN
  300.   (* Here we have some code that does something *)
  301. END;
  302.  
  303. Pascal returns its function values by assigning a value to the function
  304. name.  C returns a value by using its return statement.  Here is an
  305. example of a C function that takes no parameters and that returns a double
  306. precision floating point value, and then its Pascal equivalent:
  307.  
  308. double myFunc( void ) /* C version */
  309. {
  310.   return 3.14;
  311. }
  312.  
  313. function myFunc : DOUBLE; (* Pascal Version *)
  314. BEGIN
  315.   myFunc := 3.14
  316. END;
  317.  
  318. _____________________________________________________________________
  319. VARIABLE DECLARATIONS AND SCOPE
  320.  
  321. C makes a distinction between declaring and defining a variable.  A
  322. declaration describes the characteristics of a variable, but may or may
  323. not create the actual storage for the variable.  A definition will alway
  324. create the actual storage.  While Pascal separates its declarations into
  325. type, const and var sections, C specifies this information individually
  326. for each declaration.  C declarations can occur either within the body of
  327. an individual function, or outside of any function.  Generally, a variable
  328. declared inside a function can only be seen within that function, and only
  329. uses storage space while the program is executing the function. 
  330. Generally, a variable declared outside of any function lives for the
  331. entire execution of the program, and is visible everywhere.  But C
  332. provides some modifiers that alter those rules.  Here is an example C
  333. variable declaration to show the various parts of a declaration:
  334.  
  335. static unsigned long   myLongVar[2][3],
  336.                        * myPointerVar = & myLongVar[1][0];
  337.                        
  338. The word static is a “storage class“ specifier.  Storage class keywords
  339. are optional, and tell the compiler such things as where the variable
  340. actually lives and the width of its scope.  The unsigned and long keywords
  341. are “type“ specifiers.  They tell the compiler the type of the variable. 
  342. myLongVar and myPointerVar are the comma-separated list of names of
  343. variables to declare.  The [2][3] after myLongVar signifies that we are
  344. declaring a 2 by 3 array (with indexes starting at zero) of unsigned
  345. longs.  The star before myPointerVar means that the variable is actually
  346. of type pointer to the base type unsigned long integer, and the = &
  347. myLongVar[1][0] is an initializer that assigns an initial value to the
  348. variable.  In this case myPointerVar is initialized to the address of one
  349. of the elements of myLongVar (i.e. initialized to point to
  350. myLongVar[1][0]).
  351.  
  352. Let‘s start with the various “storage classes.“  The following table
  353. describes the storage classes (and ANSI and Apple extension type
  354. qualifiers):
  355.  
  356. Keyword         Description
  357.  
  358. auto            auto is the implied type for variables that are declared within 
  359.                 the body of a function.  And since it is implied, you will 
  360.                 probably never see the keyword actually used.  It means
  361. that the 
  362.                 variable is created on the stack each time the function is 
  363.                 called, and that it vanishes each time the function is exited. 
  364.                 The variable uses no storage at any other time, and cannot 
  365.                 been seen outside the scope of the enclosing function.  A 
  366.                 recursive function with an auto variable would have a separate 
  367.                 instance of the variable for each level of recursive depth.
  368.                 
  369. register        register variables are a variation of auto variables. 
  370. They have 
  371.                 the same scope and lifespan, but the register keyword requests 
  372.                 that the compiler try to store the variable in a register (for 
  373.                 faster access) instead of on the stack.  Each compiler has its 
  374.                 own rules about the number and type of variables that can be 
  375.                 placed in registers, and compilers generally ignore the
  376. register 
  377.                 keyword if it is used for too many variables, or for variables 
  378.                 that are too large to store in a register.
  379.                 
  380. volatile        This is an ANSI extension.  Many compilers‘ optimizers will 
  381.                 automatically try to place auto variables in registers.  The 
  382.                 volatile keyword instructs the optimizer not to do this, 
  383.                 but to store the variable on the stack.
  384.                 
  385. static          The static keyword has two uses:  First, a static variable 
  386.                 defined inside a function is local to that function, but
  387. retains 
  388.                 its value (and uses non-stack storage) throughout the life of 
  389.                 the program.  A recursive function that contains a static 
  390.                 variable would only ever have a single instance of the
  391. variable.  
  392.                 Second, a static variable defined outside of a function
  393. body has 
  394.                 its scope limited to the file that contains it - it cannot be 
  395.                 seen or used by other source files.  Similarly, the static 
  396.                 keyword can be applied to function names to prevent them from 
  397.                 being seen or called by other files.
  398.                 
  399. const           This is an ANSI extension.  The const qualifier is used to 
  400.                 specify that the given identifier is a constant that cannot be
  401.                 changed, and is similar to identifiers declared in a Pascal
  402.                 const section.  It modifies the word that follows it, so it can 
  403.                 be used in various ways:
  404.  
  405.                 const int myInt = 5; /* myInt can‘t change value */
  406.                 // The following 3 examples are pointers 
  407.                 // to characters
  408.                 const char *p; /* p can change, but what it 
  409.                                   points to can't */
  410.                 char *const p = "Hi"; /* p can't change, but what 
  411.                                         it points to can */
  412.                 const char *const p; /* Neither can be changed */
  413.  
  414. extern          The extern keyword is used to declare (without allocating any 
  415.                 storage) the characteristics of a variable which is actually 
  416.                 defined (with allocated storage) elsewhere.  The most common 
  417.                 use is to define a variable in one file (outside of the body 
  418.                 of any function), and then to have an external declaration of 
  419.                 that variable in a second file.  In this way, code in multiple 
  420.                 files can share variables without passing them as function 
  421.                 parameters.  This declaration concept can be applied to 
  422.                 functions as well as variables.  When a function is declared 
  423.                 this way, the result is commonly referred to as a “function 
  424.                 prototype.“  This usage is similar to Pascal‘s FORWARD 
  425.                 directive.
  426.                 
  427. typedef         typedef is not used for declaring variables - it is used for 
  428.                 defining types (similar to identifiers in a Pascal type 
  429.                 section).  So for typedefs, the name given at the end of the 
  430.                 declaration is the desired name for the type instead of the 
  431.                 desired name for a variable.  Like extern, typedef does not 
  432.                 create any storage.
  433.                 
  434. pascal          This is an Apple extension.  The pascal keyword is used with 
  435.                 function declarations, and is used for allowing C code to call 
  436.                 Pascal code, and vice versa.  The pascal keyword tells the 
  437.                 compiler that the given function uses Pascal‘s calling 
  438.                 conventions.  It can be used for declaring external functions 
  439.                 that are written in Pascal (such as all the Macintosh toolbox 
  440.                 calls), or it can be used for functions that are written in 
  441.                 C but that will be called from a Pascal file.  One of the 
  442.                 differences between C and Pascal function calling is that C 
  443.                 pushes function arguments onto the stack from right to left, 
  444.                 and Pascal pushes function arguments from left to right.
  445.  
  446. After the optional storage class specifiers, the next component of a
  447. declaration is the “type“ section.  The following table describes C‘s
  448. various standard variable types:
  449.  
  450. C Type  Pascal Equivalent       Description
  451. - ----  ----------------------  ----------------------------------- ---
  452. int     integer or longint      Signed integer variable type.  
  453.                                 This is supposed to be the “natural“ integer
  454.                                 size for the CPU. MPW C ints are 4 bytes, 
  455.                                 Think C ints can be either 2 or 4 bytes, 
  456.                                 selected by compiler option.
  457. char    char                    One byte character variable type.  Note that 
  458.                                 C chars are signed (-128..127) but that Pascal 
  459.                                 chars are unsigned (0..255).  See unsigned  
  460.                                 keyword below.
  461. short   integer 2 byte signed   integer variable type (on the Mac).
  462. long    longint 4 byte signed   integer variable type (on the Mac).  Can also 
  463.                                 be used in conjunction with the word double to 
  464.                                 signify an even longer float type (see 
  465.                                 extended below).
  466. comp    comp, computational     Apple Extension.  An 8 byte SANE
  467. signed                                     
  468.                                 integer.
  469. float       real, single        4 byte floating point variables (on the Mac).
  470. double      double              8 byte floating point variables (on the Mac).
  471. extended    extended            Apple Extension.  It means the same as 
  472.                                 long double, and signifies either a 10 or 
  473.                                 12 byte floating point value (depending 
  474.                                 upon whether 68881 compiling is turned on).
  475. struct      record              Used for variables with multiple fields.  The
  476.                                 field declarations are enclosed by curly 
  477.                                 braces, and each field declaration looks 
  478.                                 like a regular variable declaration.
  479. union   variant record          Used for variables with a choice of types (see 
  480.                                 below).  These look like structures, and are 
  481.                                 accessed in the same way, but are quite  
  482.                                 different.
  483.  
  484. enum    TYPE=(val1,val2,ä)      Enumerated type.
  485.  
  486. unsigned                        This modifier is used to specify unsigned 
  487.                                 versions of ints, chars, shorts, and longs.  
  488.                                 For example, an unsigned char is a one byte 
  489.                                 unsigned character variable, equivalent to a 
  490.                                 Pascal char.  If used by itself, it means 
  491.                                 unsigned int.
  492.                                 
  493. signed                          This modifier is used to signify
  494. signed                         
  495.                                 versions of the integer types. This is the
  496.                                 default in most compilers.  
  497.  
  498. void                            This type has a few uses.  When used as the 
  499.                                 return type for a function, it signifies that 
  500.                                 the function does not return any value  
  501.                                 (similar to a Pascal procedure).  When used as
  502.                                 the parameter list of a function, it signifies
  503.                                 that the function does not take any
  504.                                 parameters.  
  505.                                 When used with a star (void *) it signifies a 
  506.                                 generic pointer type that can point to any 
  507.                                 base type.
  508.  
  509. Now that we‘ve covered the elements of declarations, and since tables and
  510. syntax descriptions can only go so far, here is an example that
  511. demonstrates many of these “variable declaration“ concepts in action.  The
  512. example consists of two (very contrived) files that show a bunch of common
  513. C constructs.
  514.  
  515. /*************** Start of File1.c *****************/
  516.  
  517. /*
  518.  * This file starts by defining some global variables
  519.  * and declaring some new variable types.
  520.  */
  521. int globalToTheWorld = 10;  // Any code can access this var
  522. static int globalToThisFile = 1; // Only for code in this file
  523.  
  524. /*
  525.  * This declaration does not create any storage nor any
  526.  * variables.  It just defines a new 'uchar' variable type.
  527.  */
  528. typedef unsigned char uchar; // 'uchar' is a new type
  529.  
  530. /*
  531.  *  Define a structure variable (like a Pascal record).
  532.  *  The structure consists of two fields.
  533.  */
  534. struct
  535. {       // Fields are enclosed by curly braces
  536.   int   anInteger;          // This is one field
  537.   int * pointerToAnInteger; // This is another field
  538. } myRecordVar;              // This is the variable
  539.  
  540. /*
  541.  * It is common to combine a 'typedef' with a 'struct' to
  542.  * define a new variable type that is a structure (record).
  543.  */
  544. typedef struct
  545. {
  546.   int   anInt;
  547.   uchar aUchar;
  548. } myStructType;  // No storage, just a type
  549.  
  550. /*
  551.  * Declare a function that lives 'extern' elsewhere
  552.  * (in this case, in the Macintosh toolbox).
  553.  * Since there is no code here, the 'extern' keyword
  554.  * is implied and is not actually necessary.  This
  555.  * line is generally called a function prototype, and
  556.  * it is similar to a pascal FORWARD directive.
  557.  * the 'pascal' keyword tells the 'C' compiler to use
  558.  * Pascal function calling rules for this function.
  559.  * You actually won't have to prototype the toolbox
  560.  * routines, as you'll see when we discuss the
  561.  * C preprocessor.
  562.  */
  563. extern pascal void SysBeep( short Duration );
  564.  
  565. /*
  566.  * Now that we have some types and some global variables,
  567.  * here is some code.  This first function has the static
  568.  * keyword, and hence cannot be called from other files.
  569.  * 'void' signifies that it takes no parameters.
  570.  */
  571. static float FunctionForThisFileOnly( void )
  572. {
  573.   int    anAutoIntOnTheStack; // an implied auto, on the stack
  574.   register int inARegisterForSpeed = 2;
  575. // This next variable retains its value from call to call
  576.   static int      howManyCalls = 0;
  577.   myStructType    aStructure;
  578.   myStructType  * ptrToStruct;
  579.   void          * ptrToAnything = & globalToTheWorld;
  580.  
  581.    // each time we're called, increment this count
  582.   ++ howManyCalls;
  583.  
  584.   ptrToStruct = & aStructure; // ptr now points to the struct
  585.   aStructure.anInt = 7;       // We can access members 
  586.                                         // from the var...
  587.   ptrToStruct->aUchar = 'c';  // ...or from a ptr to the var.
  588.  
  589. // A pointer can be assigned the address of a variable
  590.   myRecordVar.pointerToAnInteger = & anAutoIntOnTheStack;
  591. /*
  592.  * A star defererences a pointer, so this statement
  593.  * actually assigns 7 to the 'anAutoIntOnTheStack' var.
  594.  */
  595.   * myRecordVar.pointerToAnInteger = 7;
  596.  
  597. /*
  598.  * The next two statements are like the last two, but note
  599.  * that to access what a void pointer points to, you must
  600.  * first cast (coerce) it to a valid type.  In this case,
  601.  * we cast it to be a pointer to an integer, and then
  602.  * dereference it.
  603.  */
  604.   ptrToAnything = & anAutoIntOnTheStack;
  605.   * (int *)ptrToAnything = 6;
  606.  
  607.   inARegisterForSpeed
  608.      = globalToThisFile + globalToTheWorld - howManyCalls;
  609.  
  610.   anAutoIntOnTheStack = inARegisterForSpeed * 2;
  611.  
  612. // The function evaluates to (returns) this:
  613.   return anAutoIntOnTheStack / 2.0;
  614. }
  615.  
  616. /*
  617.  * This second function is not static,
  618.  * so it can be called from other files.
  619.  * the two 'void' keywords signify that it
  620.  * returns no value (like a Pascal procedure)
  621.  * and that it takes no parameters.
  622.  */
  623. void GlobalDoubleBeep( void )
  624. {
  625.   SysBeep( 1 );
  626.   SysBeep( 1 );
  627. }
  628.  
  629. /****************** End of File1.c ************************/
  630.  
  631. -- cut here --
  632.  
  633. _____________________________________________________________________
  634. Bill Catambay
  635. Pascal Programmer on Macintosh and Open VMS
  636.  
  637.               />
  638.              //   The purpose of software engineering  
  639.      (//////[O]>=========================================-
  640.              \\    is to manage complexity, not to create it.
  641.               \>
  642.  
  643. ____________________________________________________________________
  644.         
  645.  
  646. ---------------------------
  647.  
  648. >From catambay@aol.com (Bill the Cat)
  649. Subject: C to Pascal FAQ (2 of 2)
  650. Date: 23 Aug 1995 02:01:32 GMT
  651. Organization: MacPascal Mailing List
  652.  
  653. -- cut here --
  654.  
  655. /******************** Start of File2.c ********************/
  656.  
  657. /*
  658.  * Because of the 'extern' keyword here,
  659.  * this declaration does not create any storage,
  660.  * it just allows code in this file to use a variable
  661.  * that is actually defined in another file (file1.c).
  662.  */
  663. extern int globalToTheWorld;
  664.  
  665. /*
  666.  * This is a function prototype, like in file1.c,
  667.  * but here I've left off the implied 'extern'.
  668.  */
  669. void GlobalDoubleBeep( void );
  670.  
  671. static float LocalFunction( void )
  672. {
  673. /*
  674.  * A union variable looks like a structure variable,
  675.  * and it is accessed in the same manner.  But instead
  676.  * of containing enough storage for ALL of its fields,
  677.  * it can only contain one of them at any given time.
  678.  * Its size is determined by the size of its largest
  679.  * field.  Generally, something else in the code keeps
  680.  * track of what kind of value is currently stored in
  681.  * a given union variable.  This is similar to having a
  682.  * variant record (a case inside a record) in Pascal.
  683.  */
  684.   union
  685.   {
  686.     float CanBeFloat;
  687.     long  CanBeLongInt;
  688.     char  CanBeChar;
  689.   } schizophrenia;
  690.  
  691.   enum {black, brown, red, orange, yellow, green, 
  692.           blue, violet, grey, white} color;
  693.  
  694. /*
  695.  * The numbers in curly braces are initial
  696.  * values for this array.  And since no size
  697.  * for the array is provided in the square
  698.  * brackets, the compiler uses the initializer
  699.  * list to set the array size -- in this case 3.
  700.  */
  701.   int Array[] = { 7, 12, 6 };
  702.  
  703. /*
  704.  * Now that we've declared our variables, here's the code:
  705.  */
  706.   Array[0] = 2; // An array of size 3 uses...
  707.   Array[1] = 5; // indexes 0, 1, and 2.
  708.   Array[2] = 17;
  709.   color = green;
  710.   ++ globalToTheWorld; // Use a variable from another file
  711.   GlobalDoubleBeep(); // Use a function from another file
  712.  
  713.   schizophrenia.CanBeFloat = 1.234;
  714. /*
  715.  * If we assign to a different field of the union, we
  716.  * wipe out the CanBeFloat value that we just put in.
  717.  */
  718.   schizophrenia.CanBeLongInt= 123456789;
  719.  
  720. /*
  721.  * Here we're interpreting a long as a float,
  722.  * so the result is basically meaningless!
  723.  */
  724.   return schizophrenia.CanBeFloat;
  725. }
  726.  
  727.  
  728. ______________________
  729. PARAMETER PASSING
  730.  
  731. One key difference between C and Pascal is that C always passes parameters
  732. by value, never by reference.  Therefore, you may be wondering how a C
  733. function can ever modify a passed in parameter.  It can‘t - but you can
  734. accomplish the same thing by passing a pointer to the value you wish to
  735. modify, and having the function modify the pointed to value.  Here is an
  736. example:
  737.  
  738. /************************ C Version *************************/
  739.  
  740. void doubleIt( int * pointerToIntParam )
  741. {
  742.   (*pointerToIntParam) *= 2;
  743. }
  744.  
  745. int main()
  746. {
  747.   int myInt = 3;
  748.  
  749.   doubleIt( & myInt );
  750.  
  751.   return myInt;
  752. }
  753.  
  754. /******************** End of C Version **********************/
  755.  
  756. (********************* Pascal Version ***********************)
  757. Program myProgram;
  758.  
  759. Var
  760.     myInt: INTEGER;
  761.  
  762. Procedure doubleIt( var IntParam: INTEGER );
  763.  
  764.     begin
  765.     IntParam := IntParam * 2
  766.     end;
  767.  
  768. begin
  769. myInt := 3;
  770.  
  771. doubleIt( myInt );
  772. end.
  773.  
  774. (****************** End of Pascal Version *******************)
  775.  
  776. OLD VERSUS NEW FUNCTION DECLARATIONS
  777. So far, I‘ve been showing functions as follows:
  778.  
  779. int MyFunc( int a, char b, float c )
  780. {
  781.   /* Code goes here */
  782. }
  783.  
  784. This way of writing functions is an ANSI extension that allows C to
  785. perform parameter type checking when calling a function.  Things weren‘t
  786. always so nice.  In the original K&R C, functions were written as follows:
  787.  
  788. int MyFunc( a, b, c )
  789. int a;
  790. char b;
  791. float c;
  792. {
  793.   /* Code goes here */
  794. }
  795.  
  796. In original C compilers, when calling a function, there was no checking of
  797. parameter types, or often even of the number of parameters!  In old C, you
  798. could write a call to a function before it had ever been defined, declared
  799. or mentioned in any way!  Now, C compilers have much stronger
  800. type-checking.  For example, Think C has a compiler option to require you
  801. to write a function prototype for every function.
  802.  
  803. ________________________________________________________________________
  804. FLOW CONTROL
  805.  
  806. So far, all of the examples that I‘ve shown execute code sequentially - in
  807. fact, I‘ve only shown declarations, assignment statements, function calls,
  808. and function return statements.  Like Pascal, C has various loops and
  809. other constructs to control the flow of code.  We‘ll start with the while
  810. loop.  The while loop in C is nearly identical to the one in Pascal,
  811. except that it needs parens around the test expression and it doesn‘t have
  812. a DO keyword.  Examples:
  813.  
  814. while ( i < j ) i *= 2;    // First C example
  815.  
  816. while i < j DO i := i * 2;    {Pascal Equiv.}
  817.  
  818. while ( i < j )         // C example w/compound statement
  819. {
  820.   sysBeep( 1 );
  821.   i *= 2;
  822. }
  823.  
  824. while i < j DO       {Pascal Equiv.}
  825.     begin
  826.     sysBeep( 1 );
  827.     i := i * 2
  828.     end;
  829.  
  830. Next we have the C do statement.  This is a loop with the test at the end
  831. of each iteration, like the Pascal REPEAT statement, but the sense of the
  832. while test at the end is the opposite of the Pascal UNTIL test.  Unlike
  833. the Pascal version, the C version needs braces if the loop contains a
  834. compound statement.  And again, the while condition needs parens. 
  835. Example:
  836.  
  837. do       // C version
  838. {
  839.   sysBeep( x );
  840.   ++ x;
  841. }
  842. while ( x != 10 );
  843.  
  844. REPEAT      {Pascal equiv.}
  845.   sysBeep( x );
  846.   x := x + 1
  847. UNTIL x = 10;
  848.  
  849. Next we have the for loop.  The for loop in C is far more general than the
  850. one in Pascal.  It looks like this:
  851.  
  852. for ( expr1; expr2; expr3 )
  853.   statement;
  854.  
  855. What it does is this:  expr1 is an initialization that is performed before
  856. executing the loop for the first time.  expr2 is a test that is performed
  857. before each iteration.  As long as expr2 evaluates to non-zero, the
  858. looping continues.  expr3 is a statement that is performed at the end of
  859. every iteration.  C does not limit loops to simple count up and count down
  860. types.  Any or all of the three expressions may be omitted, but the
  861. semicolons must remain.  Any C for loop can be rewritten as follows:
  862.  
  863. expr1;
  864. while( expr2 )
  865. {
  866.   statement;
  867.   expr3;
  868. }
  869. Example:
  870.  
  871. for ( i = 10; i != 0; --i )   // C example
  872.   DoIt( i );
  873.  
  874. for ( i = 10; i; --i )     // An equivalent variation
  875.   DoIt( i );
  876.  
  877. i = 10;           // Another equivalent variation
  878. while ( i )
  879. {
  880.   DoIt( i );      // Could use pre or post decrement
  881.   -- i;
  882. }
  883.  
  884. i = 10;           // Yet another equivalent variation
  885. while ( i )
  886.   DoIt( i-- );    // Must use post decrement
  887.  
  888. FOR i := 10 DOWNTO 0 DO   {Pascal equivalent}
  889.    DoIt( i );
  890.  
  891. The C if statement is very similar to the Pascal version:  The else clause
  892. is optional, and the statements can be either simple or compound.  The
  893. only difference is that C needs parens around the expression, it doesn‘t
  894. use the THEN keyword, and as always, every statement needs a semicolon. 
  895. Example:
  896.  
  897. if ( condition )     // C
  898.   DoOneThing();
  899. else
  900. {
  901.   DoAnother();
  902.   AndAnother();
  903. }
  904.  
  905. IF condition THEN    {Pascal version}
  906.   DoOneThing
  907. ELSE
  908.   BEGIN
  909.   DoAnother;
  910.   AndAnother
  911.   END
  912.  
  913. C has a case statement that is very similar to the Pascal version.  An
  914. example should suffice:
  915.  
  916. switch ( x )      // C version
  917. {
  918.   case 1:
  919.   case 2:
  920.     DoTheOneOrTwoThing();
  921.     break;        // Must explicitly leave each case
  922.   case 3:
  923.     DoTheThreeThing();
  924.     AndTheOtherThreeThing();  // Purposely fall through
  925.   case 7:
  926.     DoTheThreeAndSevenThing();
  927.     break;
  928.   default:
  929.     DoTheDefaultThing();
  930. }
  931.  
  932. CASE x OF         { Pascal Version }
  933.   1, 2:  DoTheOneOrTwoThing;
  934.   3:     BEGIN
  935.          DoTheThreeThing;
  936.          AndTheOtherThreeThing;
  937.          DoTheThreeAndSevenThing; { In Pascal, we need this twice }
  938.          END;
  939.   7:     DoTheThreeAndSevenThing; {In Pascal, we need this twice}
  940.   OTHERWISE 
  941.          DoTheDefaultThing
  942. {CASE}   END;
  943.  
  944. The previous example used the C break keyword.  This keyword is like the
  945. Pascal Leave statement, and can be used to break out of the innermost
  946. while, do, for, or switch.  C also has a continue keyword that like the
  947. Pascal Cycle statement.  It skips to the next iteration of the innermost
  948. while, do or for loop.
  949.  
  950. Finally, C also has the dreaded goto statement (nothing seems to split
  951. programmers into warring factions as well as a goto statement does). 
  952. Unlike in Pascal, you don‘t declare labels in C, you just stick ‘em in the
  953. code, and they follow the same syntax as other identifiers.  Example:
  954.  
  955. {              // C
  956.   MyLabel:
  957.     x := Function();
  958.     if ( x == 10 ) goto MyLabel;
  959. }
  960.  
  961. LABEL 333; { Pascal }
  962.      BEGIN             
  963. 333: x := Function;
  964.      IF x=10 THEN GOTO 333
  965.      END
  966.  
  967. ________________________________________________________________________
  968. LIBRARY FUNCTIONS
  969.  
  970. Standard C has oodles of library functions, such as malloc() and fread(),
  971. that you would use if you were programming on any computerä unless you are
  972. programming on a Macintoshä which you are.  So for the most part, you will
  973. use calls like NewPtr() and FSRead() instead.  You‘ll need to look at your
  974. C compiler manual if you are interested in the standard C libraries.
  975. STRINGS
  976. Amazingly enough, standard C doesn‘t really provide much built-in language
  977. support for strings.  There are several standard C library functions that
  978. process strings, but no real string type or operators.  C handles strings
  979. as simple arrays of the char type.  In general, you would create a string
  980. in one of the following ways:
  981.  
  982. {
  983.   char myString[100]; // 100 bytes of storage
  984.   char Another[] = "LetTheCompilerCountTheSize";
  985.   char * ptrToString;
  986.  
  987.   ptrToString = NewPtr( 100 );
  988. }
  989.  
  990. C also has a different way of representing strings than the Pascal way. 
  991. Instead of having a length byte followed by a number of characters, C
  992. starts immediately with characters, and the string is considered to
  993. continue until the occurrence of a zero byte.  So this declaration:
  994.  
  995. char myString[] = "Foo";
  996.  
  997. creates four bytes of storage.  It fills the first three with the word
  998. "Foo" and puts a zero byte in the fourth.  This convention allows strings
  999. of arbitrary length.
  1000.  
  1001. This string representation doesn‘t fit well with Pascal nor with the Mac
  1002. toolbox, but don‘t despair.  C only uses this convention in two places: 
  1003. In string constants (like the "Foo" shown above) and in its library
  1004. functions.  The Mac solves the second problem by shunning the C library
  1005. that is used by the rest of the world, in favor of its own toolbox.  And
  1006. the compilers on the Mac solve the first problem by introducing an
  1007. ingenious extension, the \p escape sequence.  Here is an example:
  1008.  
  1009. char pascalString[] = "\pFoo";
  1010.  
  1011. This causes the compiler to insert a Pascal-style length byte at the
  1012. beginning of the string.  It still generates a zero-byte at the end,
  1013. however.  So the above declaration would use five bytes:  The first byte
  1014. contains a 3 (for the Pascal length), the next three bytes contain the
  1015. string, and the final byte contains the C-style zero byte.  So
  1016. pascalString can be used as a Pascal string, and (pascalString+1) or
  1017. &pascalString[1] can be used as a C string.
  1018.  
  1019. _______________________________________________________________________
  1020. THE PREPROCESSOR
  1021.  
  1022. C compilers include a preprocessor step that reads in the source file,
  1023. expands macros, and then writes back a temporary file that is fed into the
  1024. actual compiler.  Keep in mind that preprocessor commands are purely
  1025. compile-time, not run-time operations.  They are similar to Pascal {$ä }
  1026. compiler directives.  Instead of being embedded within comments, C
  1027. preprocessor instructions begin with a number sign ‘#‘.  Here is a
  1028. (somewhat contrived) code fragment that includes many of the common
  1029. preprocessor instructions:
  1030.  
  1031. #include <stdio.h>
  1032. #include "myheader.h"
  1033.  
  1034. #define  DEBUG    // Delete this line before shipping program.
  1035. #define  PI    3.14159
  1036. #define  square(a)   ( ( a ) * ( a ) )
  1037. #define  cube(a)  ( ( a ) * square( a ) )
  1038. #define  max(a,b) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )
  1039.  
  1040. #pragma segment mySegment
  1041.  
  1042. double MaxSurfaceOrVolume( double radius )
  1043. /*
  1044.  * This is a strange function which will return either the 
  1045.  * surface area or the volume of a sphere, whichever is 
  1046.  * larger, for a given radius.
  1047.  */
  1048. {
  1049. #ifdef DEBUG
  1050.   printf( "Hey, we're in the MaxSurfaceOrVolume function" );
  1051. #else
  1052.   printf( "Hey, we're running the non-debug version" );
  1053. #endif
  1054.  
  1055. #if 0
  1056. I could have a bunch of lines of code in here, and they
  1057. wouldn't ever be executed, or even compiled.
  1058. #endif
  1059.  
  1060.   return max( 4 * PI * square( radius ), 
  1061.                   4.0/3.0 * PI * cube( radius ) );
  1062. }
  1063.  
  1064. The following table describes the preceding preprocessor statements:
  1065.  
  1066. Preprocessor Statement  Meaning
  1067. - --------------------------------------------------------------
  1068. #include <stdio.h>      Similar to the Pascal {$I filename} directive.  Paste 
  1069.                         the contents of the included file into here as if they 
  1070.                         had actually been typed into this file.  The angle 
  1071.                         brackets generally tell the compiler to look for the 
  1072.                         include file in its list of “system“ file folders.  
  1073.                         Include files are generally named with a .h at the end. 
  1074.                         They generally consist of things like typedefs, global 
  1075.                         variable definitions, function prototypes, preprocessor
  1076.                         macros, etc.  The Mac compilers provide header files 
  1077.                         that prototype all the toolbox functions so you don‘t 
  1078.                         have to.
  1079. #include "myHeader.h"   Same as above, but look in the list of “user“ file 
  1080.                         folders instead of system file folders.
  1081. #define DEBUG           Similar to the Pascal {$SETC DEBUG = 1} directive.  
  1082.                         Define the existence of a preprocessor variable.  The 
  1083.                         existence of the variable can be checked later.
  1084. #define PI 3.14159      A simple text substitution.  Replace all future 
  1085.                         occurences of PI with 3.14159.
  1086. #define square(a) ((a)*(a)) 
  1087.                         A substitution that takes parameters.  Keep in mind
  1088.                         that while a macro like this may look like a function 
  1089.                         call, it is purely text substitution, and therefore 
  1090.                         incurs none of the overhead of a function call.
  1091. #pragma segment mySegment   
  1092.                         The #pragma feature allows compiler specific 
  1093.                         instructions that are not actually part of the C 
  1094.                         language.  Each compiler has its own pragmas.  They 
  1095.                         are used for such things as turning optimizations on 
  1096.                         and off, disabling compiler warnings, or in this case, 
  1097.                         telling the compiler in what code segment to put this 
  1098.                         code.  They perform many of the same functions as the 
  1099.                         miscellaneous Pascal {*ä } directives.
  1100. #ifdef DEBUG            Similar to {$IFCä} in Pascal.  The subsequent statements
  1101.                         will only be compiled if the variable is defined.
  1102. #else                   Similar to {$ELSEC}.  The subsequent statements will 
  1103.                         only be compiled in the “else“ case of the preceding 
  1104.                         #if.
  1105. #endif                  Similar to {$ENDC}.  Ends a preprocessor #if or #ifdef 
  1106.                         construction. 
  1107. #if 0                   This is a quick way to disable a chunk of code.  Change 
  1108.                         it to #if 1 to re-enable.
  1109.  
  1110.  
  1111. ___________________________________________________________________________
  1112. SUMMARY
  1113.  
  1114. You should now know enough C to be able to read C code listings.  If you
  1115. would like to get some more practice at seeing the differences between C
  1116. and Pascal, you may wish to check out Dave Mark‘s first few “Getting
  1117. Started“ articles.  Dave wrote both a C and Pascal version for all of his
  1118. programs in the 1992 columns.  And while we didn‘t print all of the
  1119. listings in the magazine, we did include them in the source code disks and
  1120. in our CD-ROM.  Beyond that, you‘ll probably have to break down a buy a
  1121. couple of C books.
  1122.  
  1123. Million dollar (no, we won‘t pay you, even if you have a good answer!)
  1124. bonus question:  K&R say that the term define is used when actually
  1125. creating storage for a variable, and that the term declare is used when
  1126. describing the characteristics of a variable (and only possibly creating
  1127. storage).  So why is it that type declarations, which allocate no storage,
  1128. are spelled typedef (short for type definition) instead of being spelled
  1129. typedecl?  Perhaps this has been discussed somewhere before, but not that
  1130. I‘ve seen.  Personally, I like the C keyword, and think that K&R have the
  1131. define and declare terms backwards throughout their book!
  1132.  
  1133. -- cut here --
  1134.  
  1135. _____________________________________________________________________
  1136. Bill Catambay
  1137. Pascal Programmer on Macintosh and Open VMS
  1138.  
  1139.               />
  1140.              //   The purpose of software engineering  
  1141.      (//////[O]>=========================================-
  1142.              \\    is to manage complexity, not to create it.
  1143.               \>
  1144.  
  1145. ____________________________________________________________________
  1146.         
  1147.  
  1148. ---------------------------
  1149.  
  1150. >From Robert Nickel <rnickel@makesense.com>
  1151. Subject: Can't Deactivate Default Item??
  1152. Date: 22 Aug 1995 20:27:53 GMT
  1153. Organization: BEST Internet (415) 964-2378
  1154.  
  1155. I've created a dialog box with an OK button, which I would like to:
  1156. a) set as the default button and 
  1157. b) deactivate under certain conditions.
  1158.  
  1159. I set the button as the default with 
  1160.         SetDialogDefaultItem( dialog, ok );
  1161.  
  1162. and deactivate it with
  1163.         GetDItem( dialog, ok, &itemType, &oKButtonHdl, &itemRect );
  1164.         HiliteControl( (ControlHandle)oKButtonHdl, kButtonInactive );
  1165.  
  1166. Only trouble is, the deactivation only works when I comment out the 
  1167. default item line. If I leave the default item line in, then the button 
  1168. stays active the whole time the dialog is open.
  1169.  
  1170. Thanks in advance for any help.
  1171. -Bob
  1172.  
  1173. http://www.makesense.com/bob.shtml
  1174.  
  1175.  
  1176.  
  1177. +++++++++++++++++++++++++++
  1178.  
  1179. >From Charles B. Cranston <zben@ni.umd.edu>
  1180. Date: 22 Aug 1995 21:25:52 GMT
  1181. Organization: Network Infrastructures UMD CSC
  1182.  
  1183. In article <41dek9$gsr@news1.best.com> Robert Nickel
  1184. rnickel@makesense.com writes:
  1185.  
  1186. > SetDialogDefaultItem( dialog, ok );
  1187.  
  1188. > the deactivation only works when I comment out the 
  1189. > default item line. If I leave the default item line in,
  1190. > then the button stays active...
  1191.  
  1192. Yeah, I ran into that too.  This is how I programmed
  1193. around the problem (see case activateEvt at the end):
  1194.  
  1195. // The HiliteControl call here is a serious kluge:
  1196. // It appears that calling SetDialogDefaultItem sets a flag that
  1197. // causes ModalDialog to enable the Add button (DAQADD) under all
  1198. // circumstances in the StdFilterProc routine.  To get Add NOT to
  1199. // be lit-up when the dialog comes up, I had to un-hilite it AFTER
  1200. // the first call to StdFilterProc...
  1201.  
  1202. static pascal Boolean
  1203. aqmdf(DialogPtr dlog, EventRecord *eventp, short *ihit)
  1204. {
  1205.         Boolean keep;
  1206.         Boolean result;
  1207.         short   key;
  1208.         Handle  addhand;
  1209.         Rect    irect;
  1210.  
  1211.         Boolean (*kfilter)(Byte);
  1212.  
  1213.         SetPort(dlog);
  1214.         result = StdFilterProc(dlog,eventp,ihit);
  1215.  
  1216.         GetDialogItem(dlog,DAQADD,&key,&addhand,&irect);
  1217.         switch ( (*eventp).what ) {
  1218.         case keyDown:
  1219.         case autoKey:
  1220.                 key = charCodeMask & (*eventp).message;
  1221.                 switch ( 1 + (*(DialogPeek)dlog).editField ) {
  1222.                 case DAQCOS:
  1223.                 case DAQLIF:
  1224.                         kfilter = dokdigit;
  1225.                         break;
  1226.                 default:
  1227.                         kfilter = dokgraph;
  1228.                 }
  1229.                 if ( 0 != (cmdKey&(*eventp).modifiers) ) {
  1230.                         keep = comkey(key,kfilter);
  1231.                 } else switch(key) {
  1232.                 case '\n':
  1233.                 case 3:
  1234.                         keep = (0 == (**(ControlHandle)addhand).contrlHilite);
  1235.                         break;
  1236.                 case Escape:                            // Escape or Clear
  1237.                         keep = result;
  1238.                         if (!result)
  1239.                                 DialogDelete(dlog);     // If clear just erase everything
  1240.                         break;
  1241.                 case '\b':
  1242.                 case '\t':
  1243.                 case LeftArrow:
  1244.                 case RightArrow:
  1245.                 case UpArrow:
  1246.                 case DownArrow:
  1247.                         keep = true;
  1248.                         break;
  1249.                 default:
  1250.                         keep = (*kfilter)(key);
  1251.                 }
  1252.                 if (!keep) {
  1253.                         (*eventp).what = nullEvent;
  1254.                         result = false;
  1255.                 }
  1256.                 break;
  1257.         case activateEvt:
  1258.                 HiliteControl((ControlHandle)addhand,255);
  1259.         }
  1260.  
  1261.         return(result);
  1262. }
  1263.  
  1264. Most of this is keeping non-digits out of DAQCOS and DAQLIF
  1265. but the kluge is the activateEvt.  The mainline takes care
  1266. of actually activating and deactivating the control...
  1267.  
  1268. +-+-+
  1269. Charles B. (Ben) Cranston <zben@ni.umd.edu>
  1270. http://www.wam.umd.edu/~zben
  1271.  
  1272. ---------------------------
  1273.  
  1274. >From megawatt@noproblem.uchicago.edu (MegaWatt)
  1275. Subject: MacTCP Question
  1276. Date: Thu, 24 Aug 1995 15:58:45 GMT
  1277. Organization: University of Chicago
  1278.  
  1279. I have noticed that NewsWatcher uses the NewTCPIOCompletionProc routine,
  1280. but I cannot find any documentation on it. Is this a necessary routine? Is
  1281. there some documentation on it somewhere? I can't find it in the tech
  1282. notes either.
  1283.  
  1284. Thanks.
  1285.  
  1286. - --------------------------------------------------------------------
  1287.   MegaWatt                         |
  1288.                                    |    _____  _____  _____   _   _ 
  1289.   - AKA -                          |   |__  / | ___ || ___ \ | | | |
  1290.                                    |     / /  | |_| || |_/ / | | | |
  1291.   Aaron L. Bratcher                |    / /__ | ___ ||  __/  |_| |_|
  1292.   University of Chicago            |   |_____||_| |_||_|     (_) (_)
  1293.   megawatt@noproblem.uchicago.edu  |
  1294. - --------------------------------------------------------------------
  1295.  
  1296.  
  1297. +++++++++++++++++++++++++++
  1298.  
  1299. >From scouten@uiuc.edu (Eric Scouten)
  1300. Date: Thu, 24 Aug 1995 23:52:57 -0500
  1301. Organization: Huh? What's that?
  1302.  
  1303. In article <megawatt-2408950958450001@fpm-mac-17.uchicago.edu>,
  1304. megawatt@noproblem.uchicago.edu (MegaWatt) wrote:
  1305.  
  1306. > I have noticed that NewsWatcher uses the NewTCPIOCompletionProc routine,
  1307. > but I cannot find any documentation on it. Is this a necessary routine? Is
  1308. > there some documentation on it somewhere? I can't find it in the tech
  1309. > notes either.
  1310.  
  1311. In general, functions whose names are New___CompletionProc aren't
  1312. documented individually. They're usually preprocessor macros which
  1313. generate the data structures that the Mixed Mode Manager needs in order to
  1314. correctly switch between 68K emulation and PowerPC native execution. You
  1315. can see the definition for it in <MacTCP.h>.
  1316.  
  1317. If you're targeting PowerPC processors in your build, this is a necessary
  1318. function. If and ONLY if you are sure you'll always build for 68K only,
  1319. you can leave it out. (These days, that means don't leave it out.)
  1320.  
  1321. -es
  1322.  
  1323. __________________________________________________________________________
  1324. Eric Scouten                                       Constructor Constructor
  1325. scouten@metrowerks.com                                     Metrowerks, Inc.
  1326.  
  1327. Oh, love and money almost the same: the less you make, the more you're to blame.
  1328.    -John Gorka
  1329.  
  1330. ---------------------------
  1331.  
  1332. End of C.S.M.P. Digest
  1333. **********************
  1334.